package pe.com.bbva.modpre.persistencia.hibernate;

import java.util.List;

import org.hibernate.SessionFactory;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import pe.com.bbva.modpre.dominio.Lista;
import pe.com.bbva.modpre.dominio.Parametro;
import pe.com.bbva.modpre.persistencia.ParametroDAO;
import pe.com.bbva.modpre.utileria.Busqueda;

@Repository
@SuppressWarnings("serial")
public class ParametroHibernate extends BaseHibernate<Parametro, String> 
	implements ParametroDAO{

	@Autowired
	public ParametroHibernate(SessionFactory sessionFactory) {
		setSessionFactory(sessionFactory);
	}

	@Override
	public Parametro obtenerParametroxCodigo(String codigo) {
		return obtenerHql("select p from Parametro p where codigo=?", codigo);
	}

	@Override
	public List<Parametro> buscarParametros(Parametro parametro) {
		Busqueda filtro = Busqueda.forClass(Parametro.class);
		if (parametro != null) {
			if (parametro.getCodigo() != null) {
				filtro.add(Restrictions.ilike("codigo", parametro.getCodigo(), MatchMode.ANYWHERE));
			}
			if (parametro.getNombre() != null) {
				filtro.add(Restrictions.ilike("nombre", parametro.getNombre(), MatchMode.ANYWHERE));
			}
			if (parametro.getValor() != null) {
				filtro.add(Restrictions.ilike("valor", parametro.getValor(), MatchMode.ANYWHERE));
			}
			if (parametro.getEstado() != null && parametro.getEstado().getNombre() != null) {
				filtro.createAlias("estado", "e");
				filtro.createAlias("e.lista", "l");
				filtro.add(Restrictions.eq("l.codigo", Lista.CODIGO.REGISTRO_ESTADO));
				filtro.add(Restrictions.ilike("e.nombre", parametro.getEstado().getNombre(), MatchMode.ANYWHERE));
			}

		}
		filtro.addOrder(Order.asc("codigo"));
		return buscar(filtro);
	}
	
}
